home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / msysjour / vol03 / 06 / embedded / embedded.txt
Text File  |  1988-11-10  |  12KB  |  399 lines

  1. Figure 2
  2.  
  3. Sample Microsoft C Start-Up Routine for Embedded Applications
  4.  
  5.     NAME STARTUP_CODE
  6. ; THIS IS A SAMPLE START-UP PROGRAM FOR AN EMBEDDED SYSTEM.
  7. ; THE MEMORY LAYOUT CONFORMS TO THE NAMING CONVENTION USED 
  8. ; IN MICROSOFT C, VERSION 4.X AND 5.X.
  9. ; THIS ASSEMBLY FILE SHOULD BE ASSEMBLED USING MICROSOFT 
  10. ; MASM ASSEMBLER USING THE FOLLOWING COMMAND, ASSUMING THIS
  11. ; FILE IS CALLED STARTUP.ASM:
  12. ; >MASM STARTUP/MX,STARTUP,STARTUP,NUL
  13. ; THE /MX OPTION IS USED TO PRESERVE LOWER-CASE IN PUBLIC
  14. ; AND EXTERNAL NAMES.
  15. ;
  16. ;  SETUP OF SEGMENT CLASSES IN MICROSOFT C 5.X PROGRAMS.
  17. ;
  18. ;  HIGH ADDRESS
  19. ;    -        -------------
  20. ;    |        |'BOOTSTRAP'|
  21. ;    |        -------------
  22. ;    |        :           :
  23. ;    |        :           :
  24. ;    R        -------------  ---THESE TWO CLASSES ARE TO BE
  25. ;    O        | 'CONST'   |  ^    COPIED TO THEIR RAM
  26. ;    M        -------------  |    LOCATIONS AT POWER-UP
  27. ;    |        | 'DATA'    |  v
  28. ;    |        ------------- <---ROMCODE_END SEGMENT
  29. ;    |        | 'CODE'    |
  30. ;    -        ------------- <---ROMCODE_BEG SEGMENT
  31. ;             :           :
  32. ;             :           :
  33. ;    -        ------------- <---UDATA_END SEGMENT
  34. ;    |        | 'STACK'   |
  35. ;    |        -------------
  36. ;    |        | 'BSS'     |   
  37. ;    |        ------------- <---IDATA_END & UDATA_BEG
  38. ;    |        | 'CONST'   |  ^    SEGMENTS
  39. ;    R        -------------  |--THESE TWO CLASSES ARE TO BE ;    A        | 'DATA'    |  v    INITIALIZED BY START-UP 
  40. ;    M        ------------- <--   ROUTINE AT POWER-UP
  41. ;    |        :           :   |
  42. ;    |        :           :   |-IDATA_BEG SEGMENT
  43. ;    |        -------------
  44. ;    |        | 'INT_PTR' |
  45. ;    -        -------------
  46. ;  LOW ADDRESS
  47. ;
  48. ; CHOOSE THE MEMORY MODEL BY SETTING THE APPROPRIATE LABEL 
  49. ; TO 1.
  50. ;
  51. SMALL        EQU    0
  52. COMPACT    EQU    0
  53. MEDIUM    EQU    0
  54. LARGE        EQU    1
  55. HUGE        EQU    0
  56. STACK_SIZE    EQU    400H    ; RESERVE 1K WORD OF STACK OR ANY SIZE YOU WANT
  57. __acrtused    EQU    1    ; IT IS USED TO SATISFY THE EXTERNAL REFERENCE
  58.                 ; FOUND IN EVERY OBJECT FILE GENERATED
  59.                 ; BY THE MICROSOFT C COMPILER, VER 5.X
  60.   PUBLIC  __acrtused    ; THE SYMBOL HAS TO BE IN LOWER-CASE
  61.  
  62. DGROUP GROUP IDATA_BEG,_DATA,CONST,IDATA_END,UDATA_BEG,_BSS,STACK,UDATA_END
  63.  
  64. ;THIS SEGMENT MARKS THE BEGINNING OF ROM CODE
  65. ROMCODE_BEG SEGMENT PARA 'ROMCODE_BEG'
  66. ROMCODE_BEG ENDS
  67.  
  68. IF SMALL OR COMPACT
  69. _TEXT SEGMENT BYTE PUBLIC 'CODE'
  70.     EXTRN    _main:NEAR    ;C main()
  71. ASSUME  CS:_TEXT
  72. ENDIF
  73. IF MEDIUM OR LARGE OR HUGE
  74.     EXTRN    _main:FAR    ;C main()
  75. STARTUP_TEXT SEGMENT BYTE PUBLIC 'CODE'
  76. ASSUME  CS:STARTUP_TEXT
  77. ENDIF
  78.     ASSUME DS:DGROUP, SS:DGROUP
  79.     PUBLIC START
  80. START:
  81. START_I2ICE LABEL BYTE    ; ADDRESS LABEL FOR INTEL I2ICE
  82.     CLI
  83.     CLD
  84. ; ************************************************************
  85. ; *** YOUR CODE HERE TO DO HARDWARE INITIALIZATION
  86. ;     AND RAM CHECK ***
  87. ************************************************************
  88.         PUBLIC INIT_RAM_DATA
  89. INIT_RAM_DATA:
  90. INIT_RAM_DATA_I2ICE LABEL BYTE     ; ADDRESS LABEL FOR INTEL
  91.                             ; I2ICE
  92. ; *** TRANSFER INITIALIZATION DATA FROM ROM TO RAM ***
  93. ; COMPUTE THE SIZE OF 'DATA' AND 'CONST' CLASS IN NO. OF PARAGRAPHS:
  94.  
  95.     MOV AX,SEG IDATA_END ; FRAME NO. OF IDATA_END SEGMENT
  96.                   ;   = END OF 'CONST' CLASS IN RAM
  97.     MOV BX,SEG IDATA_BEG ; FRAME NO. OF IDATA_BEG SEGMENT
  98.                  ;   = START OF 'DATA' CLASS IN RAM
  99.     SUB AX,BX         ; AX = SIZE OF 'DATA' & 'CONST' CLASSES
  100.     MOV CL,3         ; SET UP TO MULTIPLE BY 8
  101.     SHL AX,CL         ; COMPUTE NO. OF WORDS TO BE TRANSFERRED
  102.     MOV CX,AX         ; TRANSFER COUNTER
  103.     JCXZ NO_IDATA_DATA
  104.  
  105. ; OBTAIN THE FRAME NO. OF 'DATA' CLASS PLACED IN ROM
  106.  
  107.     MOV AX,SEG ROMCODE_END ; FRAME NO. OF ROMCODE_END SEGMENT
  108.                  ; = BEGINNING OF 'DATA' CLASS IN ROM
  109.     MOV DS,AX         ; SOURCE STRING
  110.     MOV SI,0
  111.  
  112. ; OBTAIN THE FRAME NO. OF 'DATA' CLASS LOCATED IN RUN-TIME RAM SPACE
  113.  
  114.     MOV AX,SEG IDATA_BEG ; FRAME NO. OF IDATA_BEG SEGMENT
  115.                  ; = BEGINNING OF 'DATA' CLASS IN RAM
  116.     MOV ES,AX         ; DESTINATION STRING
  117.     MOV DI,0
  118.  
  119. ; INITIALIZE THE 'DATA' AND 'CONST' CLASSES IN 
  120. ; RUN-TIME RAM SPACE
  121.  
  122. REP    MOVSW            ; BEGIN WORD TRANSFER
  123.         PUBLIC NO_IDATA_DATA
  124. NO_IDATA_DATA:
  125. NO_IDATA_DATA_I2ICE LABEL BYTE    ; ADDRESS LABEL FOR 
  126.                             ; INTEL I2ICE
  127.  
  128. ; *** CLEAR UNINITIALIZED DATA ***
  129. ; COMPUTE THE SIZE OF 'BSS' & 'STACK' CLASSES IN NO. OF 
  130. ; PARAGRAPHS:
  131.  
  132.     MOV AX,SEG UDATA_END ; FRAME NO. OF UDATA_END SEGMENT
  133.                  ;   = END OF 'STACK' CLASS IN RAM
  134.     MOV BX,SEG UDATA_BEG ; FRAME NO. OF UDATA_BEG SEGMENT
  135.                  ;   = START OF 'BSS' CLASS IN RAM
  136.     SUB AX,BX         ; AX = SIZE IN PARAGRAPHS
  137.     MOV CL,3         ; SET UP TO MULTIPLE BY 8
  138.     SHL AX,CL         ; COMPUTE NO. OF WORDS TO BE INITIALIZED
  139.     MOV CX,AX         ; SETUP COUNTER
  140.     JCXZ NO_UDATA
  141.     MOV ES,BX         ; SETUP DESTINATION POINTER
  142.     MOV DI,0
  143.     MOV AX,0         ; INITIALIZE TO 0
  144. REP    STOSW
  145.         PUBLIC NO_UDATA
  146. NO_UDATA:
  147. NO_UDATA_I2ICE LABEL BYTE          ; ADDRESS LABEL FOR INTEL I2ICE
  148.  
  149. ; *** SETUP DATA AND STACK SEGMENT ***
  150.  
  151.     MOV AX,DGROUP         
  152.     MOV DS,AX         ; SETUP DATA SEGMENT
  153.     MOV SS,AX         ; SETUP STACK POINTER
  154.     MOV SP,OFFSET DGROUP:STACK_TOP
  155.     STI             ; ENABLE INTERRUPT NOW
  156.     JMP _main         ; ENTER C main() FUNCTION
  157.     HLT
  158. IF SMALL OR COMPACT
  159. _TEXT    ENDS
  160. ENDIF
  161. IF MEDIUM OR LARGE OR HUGE
  162. STARTUP_TEXT    ENDS
  163. ENDIF
  164.  
  165. ;THIS SEGMENT MARKS THE END OF ROM CODE
  166. ROMCODE_END SEGMENT PARA 'ROMCODE_END'
  167. ROMCODE_END ENDS
  168.  
  169. ; *** THE FOLLOWING SEGMENTS ARE ALL LOCATED IN RAM ***
  170.  
  171. INT_PTR SEGMENT AT 0H        ;'INT_PTR'
  172. ;INTERRUPT POINTER TABLE, LOCATE AT 0H IN RAM.
  173.     PUBLIC TYPE_0,TYPE_1,TYPE_2,TYPE_3,TYPE_4,TYPE_32
  174. TYPE_0    DD  ?    ;DIVIDE-ERROR
  175. TYPE_1    DD  ?    ;SINGLE-STEP
  176. TYPE_2    DD  ?    ;NON-MASKABLE INTERRUPT
  177. TYPE_3    DD  ?    ;BREAKPOINT
  178. TYPE_4    DD  ?    ;OVERFLOW
  179. ;SKIP INTEL RESERVED VECTORS
  180.     ORG    32 * 4
  181. TYPE_32    DD  ?    ;MAY PLACE YOUR VECTORS HERE
  182. ;MORE INTERRUPT VECTORS 
  183. INT_PTR    ENDS
  184.  
  185. ; THIS SEGMENT MARKS THE BEGINNING OF DGROUP AND INITIALIZED DATA IN RAM
  186. IDATA_BEG SEGMENT PARA PUBLIC 'IDATA_BEG'
  187. IDATA_BEG ENDS
  188.  
  189. _DATA SEGMENT WORD PUBLIC 'DATA'
  190. _DATA ENDS
  191.  
  192. CONST SEGMENT WORD PUBLIC 'CONST'
  193. CONST ENDS
  194.  
  195. ; THIS SEGMENT MARKS THE END OF INITIALIZED DATA IN RAM
  196. IDATA_END SEGMENT PARA PUBLIC 'IDATA_END'
  197. IDATA_END ENDS
  198.  
  199. ; THIS SEGMENT MARKS BEGINNING OF UNINITIALIZED DATA IN RAM
  200. UDATA_BEG SEGMENT PARA PUBLIC 'UDATA_BEG'
  201. UDATA_BEG ENDS
  202.  
  203. _BSS    SEGMENT WORD PUBLIC 'BSS'
  204. _BSS    ENDS
  205.  
  206. STACK    SEGMENT PARA STACK 'STACK'
  207.     DW STACK_SIZE DUP (?)
  208. STACK_TOP LABEL WORD
  209. STACK    ENDS
  210.  
  211. ; THIS SEGMENT MARKS THE END OF UNINITIALIZED DATA IN RAM
  212. UDATA_END SEGMENT PARA PUBLIC 'UDATA_END'
  213. UDATA_END ENDS
  214.  
  215. ; THIS SEGMENT CONTAINS BOOTSTRAP CODE AT HARDWARE RESET OR ; POWER-UP
  216. ; FAR JUMP TO PROGRAM START, LOCATE AT FFFF0H IN ROM.
  217. BOOTSTRAP SEGMENT AT 0FFFFH     ;'BOOTSTRAP'
  218.     JMP FAR PTR START
  219. BOOTSTRAP ENDS
  220.     END START
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229. Extra Figure (not used in article)
  230.  
  231. Example of a Locator Map File
  232.  
  233.  
  234. REX 8086/8087/8088/80186 OBJECT    CODE LOCATER, V5.0
  235. TIME:  14:55:23    08-10-1988
  236.  
  237. INPUT FILES: SAMPLE.LNK
  238. OUTPUT FILE: SAMPLE.ABS
  239. CONTROLS SPECIFIED IN INVOCATION COMMAND:
  240.   ORDER(CLASSES(IDATA_BEG,DATA,CONST,IDATA_END,    
  241.         UDATA_BEG,BSS,STACK,FAR_BSS,UDATA_END, 
  242.         DEBSYM,DEBTYP, 
  243.         ROMCODE_BEG,CODE,ROMCODE_END)) 
  244.   ADDRESSES(CLASSES(IDATA_BEG(200H), 
  245.             DEBSYM(20000H), 
  246.             ROMCODE_BEG(0E0000H))) 
  247.   NOINITCODE
  248.  
  249. SYMBOL TABLE OF    MODULE    startup
  250. BASE    OFFSET TYPE SYMBOL        BASE    OFFSET TYPE SYMBOL
  251. E000H    0002H  PUB  INIT_RAM_DATA    E000H    0024H  PUB  NO_IDATA_DATA
  252. E000H    003EH  PUB  NO_UDATA        E000H    0000H  PUB  START
  253. 0000H    0000H  PUB  TYPE_0        0000H    0004H  PUB  TYPE_1
  254. 0000H    0008H  PUB  TYPE_2        0000H    000CH  PUB  TYPE_3
  255. 0000H    0080H  PUB  TYPE_32        0000H    0010H  PUB  TYPE_4
  256. 0000H    0001H  PUB  __acrtused        0020H    0008H  PUB  _count
  257. 0020H    0000H  PUB  _in_ptr        E005H    0000H  PUB  _main
  258. 0020H    0004H  PUB  _out_ptr        00A1H    0080H  PUB  _picmask
  259. E005H    0086H  PUB  _process_data    00A1H    0000H  PUB  _ring_buf
  260. E005H    0092H  PUB  _sio_handler
  261.  
  262. MODULE    = startup
  263. BASE    OFFSET TYPE SYMBOL        BASE    OFFSET TYPE SYMBOL
  264. E000H    0000H  LIN  77            E000H    0001H  LIN  78
  265. E000H    0002H  LIN  88            E000H    0005H  LIN  90
  266. E000H    0008H  LIN  92            E000H    000AH  LIN  93
  267. E000H    000CH  LIN  94            E000H    000EH  LIN  95
  268. E000H    0010H  LIN  96            E000H    0012H  LIN  100
  269. E000H    0015H  LIN  102            E000H    0017H  LIN  103
  270. E000H    001AH  LIN  107            E000H    001DH  LIN  109
  271. E000H    001FH  LIN  110            E000H    0022H  LIN  114
  272. E000H    0024H  LIN  122            E000H    0027H  LIN  124
  273. E000H    002AH  LIN  126            E000H    002CH  LIN  127
  274. E000H    002EH  LIN  128            E000H    0030H  LIN  129
  275. E000H    0032H  LIN  130            E000H    0034H  LIN  131
  276. E000H    0036H  LIN  132            E000H    0039H  LIN  133
  277. E000H    003CH  LIN  134            E000H    003EH  LIN  141
  278. E000H    0041H  LIN  142            E000H    0043H  LIN  143
  279. E000H    0045H  LIN  144            E000H    0048H  LIN  145
  280. E000H    0049H  LIN  146            E000H    004EH  LIN  147
  281. FFFFH    0000H  LIN  208
  282.  
  283. MODULE    = main
  284. BASE    OFFSET TYPE SYMBOL        BASE    OFFSET TYPE SYMBOL
  285. E005H    0000H  LIN  27            E005H    0018H  LIN  28
  286. E005H    001FH  LIN  30            E005H    002FH  LIN  31
  287. E005H    0047H  LIN  32            E005H    004BH  LIN  33
  288. E005H    0065H  LIN  34            E005H    006FH  LIN  35
  289. E005H    0083H  LIN  37            E005H    0086H  LIN  41
  290. E005H    0089H  LIN  43            E005H    0090H  LIN  44
  291. E005H    0092H  LIN  47            E005H    00A4H  LIN  48
  292. E005H    00A5H  LIN  49            E005H    00AEH  LIN  50
  293. E005H    00C8H  LIN  51            E005H    00D2H  LIN  52
  294. E005H    00DAH  LIN  53            E005H    00DEH  LIN  54
  295. E005H    00E3H  LIN  55
  296.  
  297. MEMORY MAP OF MODULE startup
  298. MODULE START ADDRESS PARAGRAPH = E000H    OFFSET = 0000H
  299.  
  300. SEGMENT    MAP
  301. START      STOP       LENGTH ALIGN    NAME         CLASS          OVERLAY
  302. 00000H     00083H        0084H   A    INT_PTR                  
  303. 00200H     00200H        0000H   G    IDATA_BEG     IDATA_BEG      
  304. 00200H     00209H        000AH   W    _DATA         DATA          
  305. 0020AH     0020BH        0002H   W    CONST         CONST          
  306. 00210H     00210H        0000H   G    IDATA_END     IDATA_END      
  307. 00210H     00210H        0000H   G    UDATA_BEG     UDATA_BEG      
  308. 00210H     00210H        0000H   W    _BSS         BSS          
  309. 00210H     00A0FH        0800H   G    STACK         STACK          
  310. 00A10H     00A90H        0081H   G    FAR_BSS_1     FAR_BSS      
  311. 00AA0H     00AA0H        0000H   G    UDATA_END     UDATA_END      
  312. 20000H     20074H        0075H   G    $$SYMBOLS     DEBSYM          
  313. 20075H     200F6H        0082H   B    $$SYMBOLS     DEBSYM          
  314. 20100H     2010BH        000CH   G    $$TYPES         DEBTYP          
  315. 2010CH     20197H        008CH   B    $$TYPES         DEBTYP          
  316. E0000H     E0000H        0000H   G    ROMCODE_BEG     ROMCODE_BEG      
  317. E0000H     E004EH        004FH   B    STARTUP_TEXT     CODE          
  318. E0050H     E013DH        00EEH   W    MAIN_TEXT     CODE          
  319. E0140H     E0140H        0000H   G    ROMCODE_END     ROMCODE_END      
  320. FFFF0H     FFFF4H        0005H   A    BOOTSTRAP              
  321.  
  322. GROUP MAP
  323. ADDRESS     GROUP OR SEGMENT NAME
  324. 00200H     DGROUP
  325.       IDATA_BEG\\IDATA_BEG\\
  326.       _DATA\\DATA\\
  327.       CONST\\CONST\\
  328.       IDATA_END\\IDATA_END\\
  329.       UDATA_BEG\\UDATA_BEG\\
  330.       _BSS\\BSS\\
  331.       STACK\\STACK\\
  332.       UDATA_END\\UDATA_END\\
  333.  
  334.  
  335.  
  336.  
  337.  
  338. Figure 6
  339.  
  340. C Source for functions that implement a Ring Buffer
  341.  
  342.  
  343. /* To generate in-line 8086 opcodes for intrinsic functions,
  344.    such as inp, outp, and _enable, specify /Oi in C compiler */
  345. #define RING_BUF_SIZ 128
  346. #define PICIER 0xC2
  347. #define PICEOI 0xC0
  348. #define IRQDIS 0x20
  349. #define EOI 0x20
  350. #define SIOPORT 0x10
  351. #define OUTPORT 0x12
  352. #define enable_sio() picmask = inp(PICIER); \\
  353.                      picmask &= (~IRQDIS); \\
  354.                      outp(PICIER, picmask);
  355. #define disable_sio() picmask = inp(PICIER); \\
  356.                       picmask |= IRQDIS; \\
  357.                       outp(PICIER, picmask);
  358. char ring_buf[RING_BUF_SIZ];
  359. char *in_ptr = ring_buf;
  360. char *out_ptr = ring_buf;
  361. int count = 0;
  362. char picmask;
  363. void process_data(char);
  364.  
  365. main()
  366. {
  367.     while(1)
  368.     {
  369.         enable_sio();    /* enable serial i/o */
  370.         if (count > 0)
  371.         {
  372.             process_data(*out_ptr);
  373.             disable_sio();    /* disable serial i/o */
  374.             count--;
  375.             if (out_ptr++ == ring_buf + RING_BUF_SIZ)
  376.             out_ptr = ring_buf;    /* ring buffer */
  377.             enable_sio();    /* enable serial i/o */
  378.         }
  379.     }
  380. }
  381.  
  382. void process_data(c)
  383. char c;
  384. {
  385.     outp(OUTPORT, c);
  386. }
  387.  
  388. void interrupt far sio_handler()
  389. {
  390.     _enable();    /* enable higher order interrupt */
  391.     *in_ptr = inp(SIOPORT);
  392.     if (in_ptr++ == ring_buf + RING_BUF_SIZ)
  393.         in_ptr = ring_buf;
  394.     if (count != RING_BUF_SIZ)
  395.         count++;
  396.     outp(PICEOI, EOI);    /* reset interrupt */
  397. }
  398.  
  399.